function handlePart(part) {
    const [head, body] = part.split('\r\n\r\n') // buffer 分割
    const headStr = head.toString()
    const key = headStr.match(/name="(.+?)"/)[1]
    const filenames = headStr.match(/filename="(.+?)"/)
    if (!filenames) {
        const value = body.toString().slice(0, -2) // 把末尾的 \r\n 去掉
        return { key, value }
    }
    const fileBuffer = part.slice(head.length + 4, -2) // 文件二进制部分是 head + \r\n\r\n 再去掉最后的 \r\n 
    return { key, value: fileBuffer }
}
Buffer.prototype.split = function (sep) {
    let sepLength = sep.length, arr = [], offset = 0, currentIndex = 0
    while ((currentIndex = this.indexOf(sep, offset)) !== -1) {
        arr.push(this.slice(offset, currentIndex))
        offset = currentIndex + sepLength
    }
    arr.push(this.slice(offset))
    return arr
}

const contentTypeMap = {
    json: "application/json",// JSON数据格式
    xml: "text/xml",  //XML格式
    html: "text/html",//HTML格式
    plain: "text/plain",//纯文本格式
    multipart: "multipart/form-data",//表单中进行文件上传
    form: "application/x-www-form-urlencoded", // 表单默认的提交数据的格式
    file: "application/octet-stream",//二进制流数据（如常见的文件下载）
}
function contentTypeEquall(reqHeaders, contentTypeName) {
    const contentTypeArr = reqHeaders['content-type'].split(';') || [];
    return contentTypeArr.find(contentType => contentType.trim() === contentTypeName)
}
// 基于promise用于处理post请求中的参数
const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {
        // 非post请求返回空数据
        if (req.method === 'GET') {
            resolve({})
            return
        }
        // 请求是post的返回postData
        let postData;

        // 监听data方法，处理post数据(字节)流
        req.on('data', chunk => {
            if (contentTypeEquall(req.headers, contentTypeMap.plain) ||
                contentTypeEquall(req.headers, contentTypeMap.json)) {
                let temp = '';
                temp += chunk.toString();
                postData = JSON.parse(temp);
            } else if (contentTypeEquall(req.headers, contentTypeMap.multipart)) {
                // 获取 content-type 头，格式为： multipart/form-data; boundary=--------------------------754404743474233185974315
                // 在 multipart/form-data 中，浏览器会在请求体（request body）或称请求负载（request payload）中使用Boundary分隔form表单中的每个项目
                const contentType = req.headers['content-type'];
                const headBoundary = contentType.slice(contentType.lastIndexOf('=') + 1); // 截取 header 里面的 boundary 部分
                const bodyBoundary = '--' + headBoundary; // 前面加两个 - 才是 body 里面真实的分隔符
                arr = [];
                arr.push(chunk);
                let obj = {};
                const parts = Buffer.concat(arr).split(bodyBoundary).slice(1, -1) // 根据分隔符进行分割
                for (let i = 0; i < parts.length; i++) {
                    const { key, value } = handlePart(parts[i])
                    obj[key] = value
                }
                postData = obj;
            }
        })
        req.on('end', () => {
            if (!postData) {
                resolve({})
            } else {
                resolve(postData)
            }
        })
    })
    return promise;
}

module.exports = getPostData;